const express = require("express")
const timeStamp = require("time-stamp")
const fs = require("fs")
let path = require("path")
// 1、引入模块
let formidable = require("formidable")


let router = express.Router()
const query = require("../tools/db")


const {verifytoken,api_url} =require("../config/config")


// 登录拦截
router.use((req,res,next)=>{
    // 是否登录了：
    // 是否传递了token
    let {authorization}=req.headers
    if(!authorization){
        next("请登录")
        return
    }

    // token是否合法（是否过期  是否篡改）
    let userinfo=verifytoken(authorization)
    if(!userinfo){
        next("请重新登录")
        return
    }

    // token正常   登录状态正常
    // let {mid}=userinfo  //相同的路由之间的变量不共享

    // 但是请求对象和响应对象是共享的
    req.userinfo=userinfo
  
    next()
})
 
// 获取用户信息
router.get("/user",async (req,res,next)=>{
    let {mid}=req.userinfo

    // 根据mid获取用户的信息
    let  sql=`select    
                    id,
                    mid,
                    realname,
                    username,
                    sex,
                    birthdate,
                    concat("${api_url}","/uploads/","head/",head_photo_url) as head_photo_url
            from e_member 
            where mid="${mid}"`
    let [err,results]=await query(sql)
    if(err){
        next("个人信息请求失败")
        return
    }

    res.send({
        status:200,
        msg:"个人信息请求成功",
        results
    })

})


// 修改用户信息
router.put("/user",async (req,res,next)=>{
    let {mid}=req.userinfo

    //sex: 男1 女2  保密3
    // birthdate  时间戳
    let {realname="张三",sex=3,birthdate=1616766858000}=req.body
    // console.log(realname,sex,birthdate);
  

    let sql=`update e_member 
            set  realname="${realname}",
            sex=${sex},
            birthdate="${birthdate}"
            where mid="${mid}"`
    let [err,results]=await query(sql)
    if(err){
        next("用户信息更新失败")
        return
    }

    res.send({
        status:200,
        msg:"用户信息更新成功"
    })

})



// 我的课程（用户学习记录）
router.get("/orders",async (req,res,next)=>{
    let {mid}=req.userinfo

    // 拿着mid去订单表中查询此用户都报名了哪些课程
    // 根据课程id去课程表里面请求对应信息
    // let sql=`select * from e_order where mid="${mid}"`
    let sql=`select 
                    e_order.id,
                    e_order.cid,
                    title,
                    price,
                    concat("${api_url}","/uploads/","index/",image_src) as image_src,
                    area_name,
                    subject_name 
            from e_order 
            join e_course
            on e_order.cid=e_course.cid
            where mid="${mid}"`
    let [err,results]=await query(sql)
    if(err){
        next("我的课程请求失败")
        return
    }
    res.send({
        status:200,
        msg:"我的课程请求成功",
        results
    })

})


// 头像上传
router.post("/uploadhead",  (req, res, next) => {
    console.log(111111111111);

    // 先假设有一个token （先把登录拦截中间件注释）
   /*  let userinfo=verifytoken(`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtaWQiOiJjZDBkOWFlOC1lMDhlLTQxY2YtYWIzNi1jOGI0ZjljYjVmYzciLCJpYXQiOjE2NjE0OTgwMzksImV4cCI6MTY2MTUwMTYzOX0.bFMNtyQtv56P3797K381c3df49z9iVGHaa9ZNdNnuVo`)
    if(!userinfo){
        next("请重新登录")
        return
    }
    let {mid}=userinfo */




    // 正确写法
    let {mid}=req.userinfo



   


    // 2、设置临时上传目录
    let form = formidable({
        uploadDir: path.join(__dirname, "../tempdir")
    })

    // 3、解析文件信息
    form.parse(req, async (err, fields, files) => {
        // console.log(fields,111);//普通数据
        // console.log(files,222);// 文件数据
  
        if (err) {
            next("文件上传失败")
            return
        }


        // 4、把文件从临时目录上传到最终目录
        // 旧路径
        let oldpath = files.touxiang.filepath


        // 新名字
        let newname = timeStamp("YYYYMMDDHHmmssms") + (Math.random() + "").substring(2, 8)
        // 后缀名
        let ext = path.extname(files.touxiang.originalFilename)

        // 新路径
        let newpath = path.join(__dirname, "../uploads/head/") + newname + ext

        // 移动文件
        try {
            fs.renameSync(oldpath, newpath)

        } catch (error) {
            next("文件上传失败")
            return
        }



        // 5、修改数据库中的头像文件名
        let sql = `update e_member set head_photo_url="${newname + ext}" where mid="${mid}"`
        let [err1, results] = await query(sql)
        if (err1) {
            next("头像上传失败")
            return
        }

        // 6、前端页面如果不刷新就能直接更改头像，那么我们需要把新头像路径响应出去，让前端直接设置
        res.send({
            status:200,
            msg:"头像上传成功",
            url:newpath
            // url:api_url+"/uploads/head/"+ newname + ext
        })

    })

})



// 详情页的点击报名的接口（需要权限）
router.post("/study",async (req,res,next)=>{
    // 报名的课程: cid
   
    let {cid}=req.body
    if(!cid){
        next("请选择课程")
        return
    }


    /* // 是否登录了：哪个用户报名：mid------------------------------
    // 获取请求头
    // console.log(req.headers);
    let {authorization}=req.headers
    if(!authorization){
        next("请登录")
        return
    }

    // 解析token
    // try {
    //     let user=jwt.verify(authorization,"哈哈0411")
    //     console.log(user);
    // } catch (error) {
    //     console.log("出错了",error);
    // } 


    let userinfo=verifytoken(authorization)
    // console.log(userinfo);
    if(!userinfo){
        next("请重新登录")
        return
    }
    let {mid}=userinfo
    // console.log(mid);---------------------- */


    let {mid}=req.userinfo






    // 是否报名了------------------------------
    // 拿着cid和mid去数据库的订单表做对比，如果查询出来了则已经报名了，否则是没报名
    let sql=`select  * from e_order where mid="${mid}" and cid="${cid}"`
    let [err,results]=await query(sql)
    // res.send(results)

    if(err){
        next("报名失败")
        return
    }


    if(results.length>0){
        next("已经报名过了")
        return
    }


    // 执行报名 --------------------
    let time=+new Date()
    let oid=timeStamp("YYYYMMDDHHmmssms")+(Math.random()+"").substring(2,8)
    let sql1=`insert into 
              e_order(oid,cid,mid,createdate) 
              value("${oid}","${cid}","${mid}","${time}")`
    let [err1,results1]=await query(sql1)
    if(err1){
        next("报名失败")
        return
    }

    console.log(results1);
    res.send({
        status:200,
        msg:"报名成功",
        id:results1.insertId
    })
})


// 播放视频
router.get("/videoplay",async (req,res,next)=>{

    // 是否登录了
    let {mid}=req.userinfo


    // 是否报名了
    // 视频 vid
    let {cid,vid}=req.query
    // console.log(mid,cid);
    if(!cid || !vid){
        next("请选择正确视频")
        return
    }
     
    let sql=`select *  from  e_order where cid="${cid}" and mid="${mid}"`
    let [err,results]=await query(sql)
    if(err){
        next("视频请求失败")
        return
    }

    if(results.length==0){
        next("请先报名")
        return
    }


    let sql1=`select 
                    *,
                    concat("${api_url}","/uploads/","video/",video_src) as video_src
             from  e_video 
             where cid="${cid}" 
             and id=${vid}`
    let [err1,results1]=await query(sql1)
    if(err1){
        next("视频信息请求失败")
        return
    }

    if(results1.length==0){
        next("此课程没有该视频")
        return
    }



    res.send({
        status:200,
        msg:"视频请求成功",
        results:results1[0]
    })
})




module.exports = router